home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / test / imul.c < prev    next >
C/C++ Source or Header  |  1992-11-23  |  3KB  |  148 lines

  1.  
  2. /*
  3.  *
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8.  
  9. typedef unsigned char ubyte;
  10. typedef unsigned short uword;
  11. typedef unsigned long ulong;
  12.  
  13. #define TF_VOLATILE  0x01
  14. #define TF_REGISTER  0x02
  15. #define TF_UNSIGNED  0x04
  16.  
  17. void Operation(short, short, short, short, short, short);
  18. long Truncate(short, short, long);
  19. char *TypeNameOf(short, short);
  20.  
  21. main()
  22. {
  23.     short i, j, k;
  24.  
  25.     for (i = 0; i < 3 * 8; ++i) {
  26.     for (j = 0; j < 3 * 8; ++j) {
  27.         for (k = 0; k < 3 * 8; ++k) {
  28.         Operation(1 << (i % 3), i / 3, 1 << (j % 3), j / 3, 1 << (k % 3), k / 3);
  29.         }
  30.     }
  31.     }
  32. }
  33.  
  34. void
  35. Operation(xsize, xflags, ysize, yflags, zsize, zflags)
  36. short xsize, xflags;
  37. short ysize, yflags;
  38. short zsize, zflags;
  39. {
  40.     long x, y, z;
  41.     long r;
  42.     FILE *fi;
  43.  
  44.     x = Truncate(xsize, xflags, (rand() & 0x1FFFFF) - 0x0FFFFF);
  45.     y = Truncate(ysize, yflags, (rand() & 0x1FFFFF) - 0x0FFFFF);
  46.     z = Truncate(zsize, zflags, x * y);
  47.     printf("(%10s)%-5d * ", TypeNameOf(xsize, xflags), x);
  48.     printf("(%10s)%-5d = ", TypeNameOf(ysize, yflags), y);
  49.     printf("(%10s)%-5d\t", TypeNameOf(zsize, zflags), z, x * y);
  50.     fflush(stdout);
  51.  
  52.     /*
  53.      *    generate file
  54.      */
  55.  
  56.     if (fi = fopen("t:im.c", "w")) {
  57.     fprintf(fi, "main() {\n");
  58.     fprintf(fi, "    %s x = %d;\n", TypeNameOf(xsize, xflags), x);
  59.     fprintf(fi, "    %s y = %d;\n", TypeNameOf(ysize, yflags), y);
  60.     fprintf(fi, "    %s z;\n", TypeNameOf(zsize, zflags));
  61.     fprintf(fi, "\n");
  62.     fprintf(fi, "    z = x * y;\n");
  63.     fprintf(fi, "    printf(\"%%d\\n\", z);\n");
  64.     fprintf(fi, "    exit(0);\n");
  65.     fprintf(fi, "}\n");
  66.     fclose(fi);
  67.     printf("test ");
  68.     fflush(stdout);
  69.     if (system("dcc t:im.c -o t:im") == 0) {
  70.         system("t:im >t:im.dat");
  71.         if (fi = fopen("t:im.dat", "r")) {
  72.         char buf[256];
  73.  
  74.         r = 0;
  75.         if (fgets(buf, sizeof(buf), fi)) {
  76.             sscanf(buf, "%d", &r);
  77.         }
  78.         fclose(fi);
  79.         }
  80.         if (r != z)
  81.         printf("**** MISMATCH R=%d ****\n", r);
  82.         else
  83.         printf("OK\n");
  84.     } else {
  85.         printf("COMPILER ERROR\n");
  86.     }
  87.     }
  88. }
  89.  
  90. char *
  91. TypeNameOf(size, flags)
  92. short size;
  93. short flags;
  94. {
  95.     static char Buf[64];
  96.  
  97.     Buf[0] = 0;
  98.     if (flags & TF_VOLATILE)
  99.     strcat(Buf, " volatile");
  100.     if (flags & TF_REGISTER)
  101.     strcat(Buf, " register");
  102.     if (flags & TF_UNSIGNED)
  103.     strcat(Buf, " unsigned");
  104.     switch(size) {
  105.     case 1:
  106.     strcat(Buf, " char");
  107.     break;
  108.     case 2:
  109.     strcat(Buf, " short");
  110.     break;
  111.     case 4:
  112.     strcat(Buf, " long");
  113.     break;
  114.     }
  115.     if (Buf[0] == ' ')
  116.     movmem(Buf + 1, Buf, strlen(Buf));
  117.     return(Buf);
  118. }
  119.  
  120. long
  121. Truncate(size, flags, value)
  122. short size;
  123. short flags;
  124. long  value;
  125. {
  126.     if (flags & TF_UNSIGNED) {
  127.     switch(size) {
  128.     case 1:
  129.         return((ubyte)value);
  130.     case 2:
  131.         return((uword)value);
  132.     case 4:
  133.         return((ulong)value);
  134.     }
  135.     } else {
  136.     switch(size) {
  137.     case 1:
  138.         return((char)value);
  139.     case 2:
  140.         return((short)value);
  141.     case 4:
  142.         return((long)value);
  143.     }
  144.     }
  145.     return(0);
  146. }
  147.  
  148.